/**
 * 给定一个数组A，做N次独立的游戏。
 * 第i次游戏首先将Ai取出作为起始分数
 * 其后做任意次操作，每次操作可以取出A中的一个元素，只需该元素小于等于当前分数。
 * 取出后，当前分数增加该元素的值
 * 对每一次游戏，问最多能取出多少个元素。
 * 注意到A的原始顺序其实不影响结果，值的顺序才影响
 * 对A从小到大排序，再求一个前缀和S。
 * 对某个位置k，只要S[k-1] >= A[k]，就还能向后取。
 * 否则这一溜的位置都只能取到k-1这个位置。
 * 然后从Ak开始再往后找即可。
 * 离线回答。
 */
#include <bits/stdc++.h>
using namespace std;

#include <bits/extc++.h>
using namespace __gnu_pbds;

using llt = long long;
using pii = pair<int, int>;
using vi = vector<int>;

int N;
vector<llt> S;
vector<pair<llt, int>> A;
vi Ans;

void proc(){
    sort(A.begin(), A.end(), [](pair<llt,int>&a, pair<llt,int>&b){
        if(a.first != b.first) return a.first < b.first;
        return a.second < b.second;
    });
    for(int i=1;i<=N;++i) S[i] = S[i - 1] + A[i].first;
    Ans.assign(N + 1, 0);
  
    int k = 1;
    while(1){
        int t = 1;
        while(k + t <= N and S[k+t-1] >= A[k+t].first){
            ++t;
        }
        for(int i=k;i<k+t;++i) Ans[A[i].second] = k + t - 2;
        if(N + 1 == (k += t)) break;
    }

    for(int i=1;i<=N;++i) cout << Ans[i] << " ";
    cout << endl;
    return;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(0);
    int nofkase = 1;
    cin >> nofkase;
    while(nofkase--){
        cin >> N;
        A.assign(N + 1, {});
        S.assign(N + 1, 0LL);
        for(int i=1;i<=N;++i){
            cin >> A[i].first;
            A[i].second = i;
        }
        proc();
    }
    return 0;
}